package com.example.testlib

object CollectionOperator {
    private val a = arrayOf("4", "0", "7", "i", "f", "w", "0", "9")
    private val index = arrayOf(5, 3, 9, 4, 8, 3, 1, 9, 2, 1, 7)

    fun exampleOutput() {
        index
            .filter {
                it < a.size
            }
            .map {
                a[it]
            }
            .reduce { s, s2 ->
                "$s$s2"
            }
            .also {
                println("最终结果：s = $it")
            }
    }

    fun commonOperatorExample() {
        val test = listOf("2", "3", "x", "2", "g", "9", "k", "o")
        println(test.contains("x"))
        println(test.contains("w"))

        println(test.elementAt(3))

        println(test.firstOrNull {
            it == "3"
        })

        println(test.indexOf("k"))

        test.singleOrNull {
            it == "2"
        }.also {
            println(it)
        }

        println(test.any {
            it == "o"
        })

        val list = listOf(23, -1, 4, 6, 888, 34)
        println(list.all {
            it < 1000
        })

        println(list.none {
            it - 100 > 100
        })

        println(list.count {
            it > 0
        })

        println(list.reduce { v1, v2 ->
            v1 + v2
        })

        // 11、filter 操作符，过滤，Lambda 表达式是过滤的条件
        println(list.filter { it > 0 })    // 输出：[23, 4, 6, 888, 34]
        // 12、filterNot 与 filter 是互补的，输出 filter 过滤掉的
        println(list.filterNot { it > 0 })    // 输出：[-1]
        // 13、filterNotNull：过滤掉 null 的元素
        println(listOf(null, 3, 5, null, 8).filterNotNull())
        // 14、take：取前 n 个元素
        println(list.take(3))    // 输出：[23, -1, 4]
        // 15、mapIndexed：带 index 索引信息的 map
        println(listOf(35, 61, 116, 74).mapIndexed { index, i ->
            (i + index).toChar()
        })    // 输出：[#, >, v, M]
        // 16、mapNotNull：执行map转换前需要过滤掉 null 的元素
        println(listOf(null, 33, 55, null, 88).mapNotNull {
            it?.toChar()
        })    // 输出：[!, 7, X]
        // 17、groupBy：分组操作符。这里就是将 list 分为偶数奇数两组，返回一个 Map
        println(list.groupBy { it % 2 == 0 })    // 输出：{false=[23, -1], true=[4, 6, 888, 34]}
        // 18、reversed：生成一个与输入集合反序的集合
        println(list.reversed())    // 输出：[34, 888, 6, 4, -1, 23]
        // 19、sorted：生成一个升序排列集合，原集合不变
        println(list.sorted())
        // 20、sortedDescending：生成一个降序排列集合，原集合不变
        println(list.sortedDescending())
        // 21、sortedBy：自定义排序，主要针对 Pair、Map 等进行排序
        val pairList = listOf(1 to "A", 2 to "B", 5 to "C", 3 to "D")
        println(pairList.sortedBy {
            it.first
        })    // 输出：[(1, A), (2, B), (3, D), (5, C)]
        println(pairList.sortedBy {
            it.second
        })    // 输出：[(1, A), (2, B), (5, C), (3, D)]
    }

    fun convertTest() {
        val list: List<Int> = listOf(0, 2, 0, 3)
        list.convert {
            it + 1
        }.forEach {
            print(it)
        }
    }
}


inline fun <T, E> Iterable<T>.convert(action: (T) -> E): Iterable<E> {
    val list: MutableList<E> = mutableListOf()
    for (item in this) {
        list.add(action(item))
    }
    return list
}

